const express = require("express");
const cors = require("cors");

const fn跨域配置 = require("./代码/工具/跨域配置.js");
const fn用户认证中间件 = require("./代码/工具/用户认证.js");
const fn今日 = require("./代码/请求/今日/今日.js");
const fn一言 = require("./代码/请求/一言/一言.js");
const fn诗词 = require("./代码/请求/诗词/诗词.js");

const app = express();

const env_端口 = parseInt(process.env.PORT, 10);

if (!env_端口) {
  console.log("未通过环境变量设置端口，使用默认端口 1234");
}
let _端口 = env_端口 || 1234;

if (_端口 < 1024 || _端口 > 65535) {
  console.warn(`⚠️  端口 ${port} 不合规。正在使用默认值 1234。`);
  _端口 = 1234;
}

// #region 跨域
// 读取跨域配置
const _跨域配置 = fn跨域配置();
console.log(`🔧 跨域配置策略: ${_跨域配置.跨域策略}`);

// 根据配置应用 CORS 中间件
let _cors中间件 = null;
if (_跨域配置.跨域策略 === "全部允许") {
  _cors中间件 = cors({
    origin: true,
    credentials: true,
  });
} else if (_跨域配置.跨域策略 === "白名单" && _跨域配置.跨域列表.length > 0) {
  _cors中间件 = function(req, res, next) {
    const origin = req.get('Origin');
    
    // 如果没有 origin（例如来自本地文件的请求），允许通过
    if (!origin) {
      console.log();
      console.log("🔍 无 Origin 头，允许请求通过");
      return cors({
        origin: true,
        credentials: true,
      })(req, res, next);
    }

    // 检查 origin 是否在允许列表中
    if (_跨域配置.跨域列表.indexOf(origin) !== -1) {
      console.log();
      console.log(`✅ 允许来自 ${origin} 的跨域请求`);
      return cors({
        origin: origin,
        credentials: true,
      })(req, res, next);
    } else {
      console.log();
      console.log(`🚫 拒绝来自 ${origin} 的跨域请求，该来源不在允许列表中`);
      
      // 记录跨域失败访问
      if (_跨域配置.记录失败访问) {
        const _客户端IP = req.ip || req.connection?.remoteAddress || "未知IP";
        _跨域配置.记录失败访问(_客户端IP, req.url, origin);
      }
      
      // 发送跨域拒绝响应并终止请求处理
      return res.status(403).send('CORS not allowed');
    }
  };
} else {
  // 禁用跨域或白名单为空的情况，不应用 cors 中间件
  _cors中间件 = null;
}

if (_cors中间件) {
  app.use(_cors中间件);
  console.log("✅ CORS 中间件已应用");
} else {
  console.log("🚫 不允许跨域 未应用 CORS 中间件");
}

// #endregion

// 应用用户认证中间件
app.use(fn用户认证中间件);
console.log("✅ 用户认证中间件已应用");

// 注册 /jin_ri 路由
app.get("/jin_ri", fn今日);
console.log("✅ /jin_ri 今日路由已注册");

// 注册 /yi_yan 路由
app.get("/yi_yan", fn一言);
console.log("✅ /yi_yan 一言路由已注册");

// 注册 /shi_ci 路由
app.get("/shi_ci", fn诗词);
console.log("✅ /shi_ci 诗词路由已注册");

// // 注册 /yi_yan 路由
// const r_一言 = express.Router();
// r_一言.get("/", fn一言);
// r_一言.get("/:path", fn一言);  // 简单的命名参数
// app.use("/yi_yan", r_一言);
// console.log("✅ /yi_yan 及其子路径路由已注册");

// 处理未匹配的路由
app.use((req, res) => {
  console.log(`❓ 未找到路由: ${req.method} ${req.url}`);
  res.send(
    new Date().toLocaleString("zh-CN", {
      timeZone: "Asia/Shanghai",
    })
  );
});

app.listen(_端口, () => {
  console.log(`项目 今日信息 开始运行，监听端口 ${_端口}`);
  console.log();
});
